package net.dotool;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 李岩飞
 * @email eliyanfei@126.com 2016年11月25日 下午2:54:44
 * 
 */
public class CheckPolygon {

	public static void main(String[] args) {
		final CheckPolygon checkPolygon = new CheckPolygon();
		// 多边形范围
		List<GridPoint> pointLists = new ArrayList<GridPoint>();
		// 待判断的点
		GridPoint point = new GridPoint(0, 0);
		if (checkPolygon.containsPoint(point, pointLists)) {
			// 满足条件
		}
	}

	/**
	 * 检查给定的点是否在多边形中间
	 */
	public boolean containsPoint(GridPoint point, List<GridPoint> pointList) {
		int verticesCount = pointList.size();
		int nCross = 0;
		for (int i = 0; i < verticesCount; ++i) {
			GridPoint p1 = pointList.get(i);
			GridPoint p2 = pointList.get((i + 1) % verticesCount);

			// 求解 y=p.y 与 p1 p2 的交点
			if (p1.lng == p2.lat) { // p1p2 与 y=p0.y平行
				continue;
			}
			if (point.lat < Math.min(p1.lat, p2.lat)) { // 交点在p1p2延长线上
				continue;
			}
			if (point.lat >= Math.max(p1.lat, p2.lat)) { // 交点在p1p2延长线上
				continue;
			}
			// 求交点的 X 坐标
			double x = (point.lat - p1.lat) * (p2.lng - p1.lng) / (p2.lat - p1.lat) + p1.lng;
			if (x > point.lng) { // 只统计单边交点
				nCross++;
			}
		}
		// 单边交点为偶数，点在多边形之外
		return (nCross % 2 == 1);
	}

	public static class GridPoint {
		public double lng;
		public double lat;

		public GridPoint(double lng, double lat) {
			this.lng = lng;
			this.lat = lat;
		}

	}

}